package chapter_02
import scala.collection.immutable
import scala.util.control.Breaks._

/**
  *
  * @author Pop
  * @date 2022/6/12 22:05
  *
  *      循环
  */
object Test08_ForLoop {
  def main(args: Array[String]): Unit = {
      // 范围遍历
      // 循环打印10次，范围 1 to 10
    // 运算符的本质都是方法调用，这里的to也是一个方法调用
    // 前面的这个1 可以看做是一个Int的to方法
    for(i <- 1 to 10){
      println(i+". hello world")
    }
    // 这里是to是一个隐式转换
    for(i:Int <- 1.to(10)){
      println(i+". hello world")
    }

    // 不包含边界的写法，上面会打印1 - 10 如果我不想包含10这个边界呢

    for(i<- Range(1,10)){
      // 这就是不包含边界的，写法，其实 范围的to方法调用返回了Range里的方法
      //他的返回值也是一个Range，他的伴生对象的中有一个isInclusive，是否包含，默认是true
    }

    // 另一种写法 不包含边界的写法
    for(i <- 1 until 10){

    }

    // 2 集合遍历
    for(i <- Array(12,34,53)){
      println(i)
    }

    for(i <- List(12,34,53)){
      println(i)
    }

    for(i <- Set(12,34,53)){
      println(i)
    }

    // 循环守卫，当你的if条件不符合的时候，将会跳过这次循环，相当于continue
    // 但是在scala中没有continue
    for(i <- 1 to 10){
      if(i != 5){
        println(i)
      }
    }
    for(i <- 1 to 10 if i != 5){
      println(i)
    }
    // 步长 每次增长 2 ，by也是Range的方法
    for(i <- 1 to 10 by 2){
      println(i)
    }
    // 如果你的开始比起始要小，这个循环会不成立，程序会跳过
    for(i <- 10 to 1 by -2){
      println(i)
    }
    // 反转 也可以这样使用
    for(i <- 10 to 1 reverse){
      println(i)
    }
    // error 步长不能为0
    for(i <- 1 to 10 by 0){
      println(i)
    }

    // 可以是 一半一半成长吗
    for(data <- 1.0 to 10.0 by 0.3){

    }

    // 嵌套循环
    for(i <- 1 to 3){
      for(j<- 1 to 3){

      }
    }
    // 等同于 用分号隔开，这也是一个二维矩阵
    for(i<-1 to 4;j<-1 to 5){

    }

    //循环的返回值
    val a: Unit = for(i<-1 to 10){
        "hello"
    }
    // for 里的默认情况是返回Unit的

    val ints: immutable.IndexedSeq[Int] = for(i <- 1 to 10) yield i*i
    // 这个返回结果，会把每次的结果，放入一个结合做返回、
    // yield 在scala中和线程没有任何关系，只是返回的关键字而已



    // 循环中断 scala中取消了break的方式

    // 使用抛出异常的方式抛出异常

    try {
      for(i <- 1 until 5){
        if(i==3){
          throw new RuntimeException
        }
      }
    }catch {
      case  e:Exception=>
    }

    // 使用 Breaks类的break方法，实现异常的抛出和捕获
    // import scala.util.control.Breaks._
//    Breaks.breakable(
    breakable(
      for(i <- 1 until 5){
        if(i==3){
//          Breaks.break()
          break()
        }
      }
    )

  }
}
